package leetcode.set_map;

import java.util.*;

/**
 * 451. 根据字符出现频率排序
 * <p>
 * 给定一个字符串，请将字符串里的字符按照出现的频率降序排列。
 * <p>
 * 示例 1:
 * <p>
 * 输入:
 * "tree"
 * <p>
 * 输出:
 * "eert"
 * <p>
 * 解释:
 * 'e'出现两次，'r'和't'都只出现一次。
 * 因此'e'必须出现在'r'和't'之前。此外，"eetr"也是一个有效的答案。
 * <p>
 * 示例 2:
 * <p>
 * 输入:
 * "cccaaa"
 * <p>
 * 输出:
 * "cccaaa"
 * <p>
 * 解释:
 * 'c'和'a'都出现三次。此外，"aaaccc"也是有效的答案。
 * 注意"cacaca"是不正确的，因为相同的字母必须放在一起。
 * <p>
 * 示例 3:
 * <p>
 * 输入:
 * "Aabb"
 * <p>
 * 输出:
 * "bbAa"
 * <p>
 * 解释:
 * 此外，"bbaA"也是一个有效的答案，但"Aabb"是不正确的。
 * 注意'A'和'a'被认为是两种不同的字符。
 * 分析：词频统计+优先队列+ 定义优先级+遍历输出形式
 */
public class Solution451 {
    public static String frequencySort(String s) {

        //统计词频
        Map<Character, Integer> freq = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char key = s.charAt(i);
            if (freq.get(key) == null) {
                freq.put(key, 1);
            } else {
                freq.put(key, freq.get(key) + 1);
            }
        }
        Queue<Character> priorityQueue = new PriorityQueue<Character>(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (freq.get(o1) - freq.get(o2) > 0) {
                    return -1;
                } else if (freq.get(o1) - freq.get(o2) < 0) {
                    return 1;

                } else
                    return 0;
            }
        });

        Queue<Character> p1 = new PriorityQueue<>((o1, o2) -> freq.get(o2) - freq.get(o1));
        // 进行入队操作；
        for (Character k : freq.keySet()) {
            priorityQueue.add(k);
        }

        //进行出队操作，但是需要将元素个数和map的 value数进行对应
        StringBuilder stringBuilder = new StringBuilder();
        while (!priorityQueue.isEmpty()) {
            Character c = priorityQueue.remove();
            Integer integer = freq.get(c);
            for (int i = 1; i <= integer; i++) {
                stringBuilder.append(c);
            }
        }

        return stringBuilder.toString();

    }

    public static void main(String[] args) {
        String s = "cccaaa";
        System.out.println(frequencySort(s));
    }
}
